/**
 * @file log.h
 * @author chushang (email:chushangcs@163.com)
 * @brief 嵌入式系统日志模块头文件，提供日志输出接口
 * @version 0.1
 * @date 2025-08-10
 *
 * @copyright Copyright (c) 2025
 *
 */

#ifndef __LOG_USART_H
#define __LOG_USART_H

#include <stdarg.h> // 可变参数支持

#define ENABLE_LOG_USART 1 /**< 是否使用日志功能 */

/**
 * @brief 日志等级枚举
 */
typedef enum
{
    LOG_LEVEL_ERROR = 0, /**< 错误级别日志，表示严重错误 */
    LOG_LEVEL_WARNING,   /**< 警告级别日志，表示潜在问题 */
    LOG_LEVEL_INFO,      /**< 信息级别日志，表示一般信息 */
    LOG_LEVEL_DEBUG      /**< 调试级别日志，用于开发调试 */
} LogLevel;

/**
 * @brief   日志打印函数
 *
 * @param[in] level     错误等级
 * @param[in] func      调用该函数的函数名
 * @param[in] line      调用所在行数
 * @param[in] format    可变参数
 * @param[in] ...       可变参数
 */
void Log_Print(LogLevel level, const char *func, int line, const char *format, ...);

/**
 * @brief  将浮点数据转换为字符串
 *
 * @param[out] str 转换后的字符串
 * @param[in]  va  待转换的浮点数
 */
void Float2Str(char *str, float va);

#if defined(ENABLE_LOG_USART) && ENABLE_LOG_USART == 1
/**
 * @brief 日志宏定义
 * 这些宏自动传入当前函数名和行号，简化日志调用
 */
#define Log_Error(...) Log_Print(LOG_LEVEL_ERROR, __FUNCTION__, __LINE__, ##__VA_ARGS__)   /**< 错误日志宏 */
#define Log_Warn(...)  Log_Print(LOG_LEVEL_WARNING, __FUNCTION__, __LINE__, ##__VA_ARGS__) /**< 警告日志宏 */
#define Log_Info(...)  Log_Print(LOG_LEVEL_INFO, __FUNCTION__, __LINE__, ##__VA_ARGS__)    /**< 信息日志宏 */
#define Log_Debug(...) Log_Print(LOG_LEVEL_DEBUG, __FUNCTION__, __LINE__, ##__VA_ARGS__)   /**< 调试日志宏 */
#elif
#define Log_Error(...)
#define Log_Warn(...)
#define Log_Info(...)
#define Log_Debug(...)
#endif // ENABLE_LOG_USART

#endif // !__LOG_USART_H
